package com.gxa.educate.portal.tablet.earlyeducation.controller;

import com.gxa.educate.core.common.JsonResult;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Map;
import java.util.UUID;

@RestController
public class UploadController {
    @Autowired
    TransferManager transferManager;
    @RequestMapping("/upload")
    public Map<String,Object> upload(@RequestParam("file") MultipartFile[] multipartFile, HttpServletRequest request) throws Exception {
        JsonResult jsonResult = new JsonResult();
        String fileNames[]=new String[multipartFile.length];
        // 使用高级接口必须先保证本进程存在一个 TransferManager 实例，如果没有则创建
        // 详细代码参见本页：高级接口 -> 创建 TransferManager
        // 存储桶的命名格式为 BucketName-APPID，此处填写的存储桶名称必须为此格式
        String bucketName = "lh-1312542810";
        // 对象键(Key)是对象在存储桶中的唯一标识。
        //QQ截图20200724153059.png
        for (int i=0;i<multipartFile.length;i++) {
            String originalFilename = multipartFile[i].getOriginalFilename();
            //System.out.println("originalFilename:" + originalFilename);
            // 从原始文件名中获取后缀,作为新添加的文件的文件名后缀(匹配)
            String subfix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            //System.out.println("subfix:" + subfix);
            //使用UUID作为文件名,保证服务器中存放的文件名唯一
            String targetFile = UUID.randomUUID().toString().replace("-", "") + "." + subfix;
            //System.out.println("targetFile:" + targetFile);
            fileNames[i]=targetFile;
            String key =targetFile;
            // 通过request获取当前程序的根路径"/"
            //String path =request.getSession().getServletContext().getRealPath("/");

            // 这里创建一个 ByteArrayInputStream 来作为示例，实际中这里应该是您要上传的 InputStream 类型的流
//            long inputStreamLength = 1024 * 1024;
            byte data[] = multipartFile[i].getBytes();
            InputStream inputStream = new ByteArrayInputStream(data);
            ObjectMetadata objectMetadata = new ObjectMetadata();
            // 上传的流如果能够获取准确的流长度，则推荐一定填写 content-length
            // 如果确实没办法获取到，则下面这行可以省略，但同时高级接口也没办法使用分块上传了
            objectMetadata.setContentLength(multipartFile[i].getBytes().length);
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata);
            try {
                // 高级接口会返回一个异步结果Upload
                // 可同步地调用 waitForUploadResult 方法等待上传完成，成功返回UploadResult, 失败抛出异常
                Upload upload = transferManager.upload(putObjectRequest);
                UploadResult uploadResult = upload.waitForUploadResult();
//                System.out.println(uploadResult.getKey());
            } catch (CosServiceException e) {
                e.printStackTrace();
            } catch (CosClientException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // 确定本进程不再使用 transferManager 实例之后，关闭之
            // 详细代码参见本页：高级接口 -> 关闭 TransferManager
//            String path="https://lh-1312542810.cos.ap-chengdu.myqcloud.com";
////            String fileName = path + "/images/uploadImg/" + targetFile;
////            System.out.println("fileName:" + fileName);
//            // 构建文件对象
//            File uploadFile = new File(path+targetFile);
//            multipartFile[i].transferTo(uploadFile);
        }
        shutdownTransferManager(transferManager);

        //核心操作(含有异常操作, 利用异常设定状态码(和前端约定)
        // 此处应当和ExceptionController结合, 当try执行成功则设定状态码0
        // 出现异常则设定其他
        // 再将异常信息结合BusinessException抛出, 交给ExceptionController处理


        // 返回状态:200 表示上传成功
        jsonResult.setCode("200");
        // 返回服务器保存后的文件名
        jsonResult.set("fileName", fileNames);
        return jsonResult.getMap();
    }
    public void shutdownTransferManager(TransferManager transferManager) {
        // 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
        // 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
        transferManager.shutdownNow(true);
    }
}

